package pub_cli

import (
	"GoMaestro/internal/conf"
	"context"
	"errors"
	"fmt"
	"log/slog"
	"strconv"
)

// CreateBuildTask 创建一个新的 jencli 构建任务
// 传入：管线名称、入参
// 返回：构建id、管线名称、错误信息
func CreateBuildTask(jobName string, params map[string]string) (int64, string, error) {
	for key, value := range params {
		if value == "" {
			return 0, "", fmt.Errorf("参数 '%s' 的值不能为空", key)
		}
	}
	JenClient := conf.JenClient

	ctx := context.Background()
	// 实现创建逻辑
	if JenClient == nil {
		return 0, "", errors.New("jenkins not initialized")
	}
	queueId, err := JenClient.BuildJob(ctx, jobName, params)
	// sdk的原因，引擎重启后首次并发构建会报错,手动忽略
	if err != nil && err.Error() != "Don't have key \"Location\" in response of header" {
		slog.Error("任务构建失败", slog.Any("error", err))
		return 0, "", err
	}
	if queueId == 0 {
		return 0, "", errors.New("作业任务已在队列中。 如需优化,请将该job的静默期调整为0秒。默认为5秒,需设置为0秒即可解决。配置路径：jobName-->configure-->Quiet period  静默功能说明：https://www.jenkins.io/blog/2010/08/11/quiet-period-feature/")
	}

	// 这段代码是一个循环，检查任务的 Executable.Number 是否为 0。根据 jencli 的 API，任务在队列中会有一个大约 4.7 秒的静默期。
	// 在此期间，任务的构建编号可能尚未分配。循环中每隔 1 秒调用一次 Poll 方法来更新任务状态。如果在此过程中发生错误，返回 nil 和错误信息。
	buildInfo, err := JenClient.GetBuildFromQueueID(ctx, queueId)
	if err != nil {
		return 0, "", err
	}
	// job任务中的id
	jobBuildIdStr := buildInfo.Raw.ID

	jobBuildId, err := strconv.ParseInt(jobBuildIdStr, 10, 64)
	if err != nil {
		return 0, "", err
	}

	return jobBuildId, jobName, nil
}
